﻿

#include "bns.h"


void docMotVung(FILE* filePtr, BYTE headerSize, int x0, int y0, int cx, int cy, int bytesPerPixel,
	int rowLength, BYTE* &outPtr)
{
	if (outPtr)
		free(outPtr);

	outPtr = (BYTE*)malloc(cy*cx*bytesPerPixel);
	HANDLE_NULL(outPtr);

	BYTE* ptr = outPtr;

	//Thực hiện đọc từng hàng ảnh
	fseek(filePtr, headerSize + y0 *rowLength + x0*bytesPerPixel, SEEK_SET);
	for (int i = 0; i < cy; ++i)
	{
		fread(ptr, sizeof(BYTE), cx*bytesPerPixel, filePtr);
		ptr += cx*bytesPerPixel;
		fseek(filePtr, rowLength - cx*bytesPerPixel, SEEK_CUR);
	}
}

void tinhNghichDao(double f[6], double g[6])
{
	g[0] = f[4];
	g[1] = -f[1];
	g[2] = f[1] * f[5] - f[2] * f[4];
	g[3] = -f[3];
	g[4] = f[0];
	g[5] = f[2] * f[3] - f[0] * f[5];
	for (int i = 0; i < 6; i++)
		g[i] /= (f[0] * f[4] - f[1] * f[3]);
}

void docPhanHeader(FILE *filePtr, int* width, int* height, int* depth,
	int* rowLength, int *headerSize)
{
	//Đọc phần header file
	BITMAPFILEHEADER bmfh;
	int soByteDocDuoc = 0;
	soByteDocDuoc = fread(&bmfh, sizeof(BITMAPFILEHEADER), 1, filePtr);
	if (soByteDocDuoc != 1 ||
		bmfh.bfType != *(WORD*)"BM")
	{
		fprintf(stderr, "Khong the duoc file, hoac file sai dinh dang.\n");
		fclose(filePtr);
		return;
	}

	// kích thước phần thông tin ảnh và dữ liệu ảnh
	int infoSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
	int dataSize = bmfh.bfSize - bmfh.bfOffBits;

#ifdef _DEBUG
	printf("Du lieu anh: %d bytes\n", dataSize);
#endif

	// Đọc phần header ảnh
	BITMAPINFO* pbmi = NULL;
	pbmi = (BITMAPINFO*)malloc(infoSize);
	HANDLE_NULL(pbmi);

	soByteDocDuoc = fread(pbmi, sizeof(BITMAPINFO), 1, filePtr);
	if (soByteDocDuoc != 1)
	{
		fprintf(stderr, "Khong the duoc file, hoac file sai dinh dang.\n");
		fclose(filePtr);
		return;
	}

	// Tính chiều dài , chiều rộng
	// số lượng bytes trên một hàng ảnh
	*width = pbmi->bmiHeader.biWidth;
	*height = pbmi->bmiHeader.biHeight;
	*depth = pbmi->bmiHeader.biBitCount;
	*rowLength = (((*width) * (*depth) + 31) & ~31) >> 3;
	*headerSize = sizeof(BITMAPFILEHEADER)+infoSize;

#ifdef _DEBUG
	printf("width = %d\n"
		"height = %d\n"
		"rowLength = %d\n"
		"depth = %d\n"
		"headerSize = %d\n", *width, *height, *rowLength,
		*depth, *headerSize);
#endif

}